# @Time : 2024/10/28 21:27
# @Author : Fioman 
# @Phone : 13149920693
"""
在Python中,函数是一等公民
1) 函数可以赋值给变量
2) 函数可以作为另外一个函数的参数和返回值
Python中存在高阶函数,高阶函数可以接收另外的函数作为参数,或者是返回值是其他函数的函数.
"""


def add(a, b):
    return a + b


func = add
res = func(1, 2)
print(res)


# 函数作为另外一个函数的参数或者返回值,装饰器的视线
def wrapper(func, *args, **kwargs):
    def inner(*args, **kwargs):
        print("被装饰函数执行之前要做的逻辑")
        ret = func(*args, **kwargs)
        print("被装饰函数执行之后要做的逻辑")
        return ret

    return inner


@wrapper
def sub(a, b, c):
    print("被装饰函数本身被执行")
    return a - b - c


res = sub(1, 2, 3)
print("sub() 计算结果为: {}".format(res))

# region 1. 高阶函数之map(func,iterable1,iterable2) 其中可迭代序列的个数和func函数的参数个数相同
# 功能是将后面的可迭代序列作用于func然后生成一个迭代器
res = map(sub, [1, 2, 3], [2, 3, 4], [3, 4, 5])
from collections.abc import Iterator

print(list(res), type(res), isinstance(res, Iterator))  # [-4, -5, -6] <class 'map'> True


def func1():
    pass


# 从语法上讲,map也可以接收一个无参的函数,但是后面的可迭代序列必须是[]
res = map(func1, [])
print(list(res), type(res), isinstance(res, Iterator))


# endregion

# region 2. filter(func,iterable) 将后面的可迭代序列,带入前面的函数,如果返回True就保留,否则丢弃
def is_bigger_than_100(a):
    return a > 100


res = filter(is_bigger_than_100, range(1, 102))
print(list(res), type(res), isinstance(res, Iterator))

res = filter(lambda x: x > 100, range(1, 102))
print(list(res), type(res), isinstance(res, Iterator))

# endregion

# region 3. reduce 将第一个值和第二个值进行计算作为结果和第三个值进行计算,后面一直累积
from functools import reduce

res = reduce(lambda x, y: x + y, range(1, 10), 1000)
print(res)
# endregion
